package com.qq.网络编程.UDP1;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/*
 
	UDP协议： 
	UDP是一种无连接、不可靠传输的协议。
	不事先建立连接，数据按照 "包"发送，
	一包数据包含：自己的IP、程序端口，目的地IP、程序端口和数据（限制在64KB）
	发送不管对方是否准备好，接收方收到也不确认，故是不可靠的 
	可以广播发送 ，发送数据结束时无需释放资源，开销小，速度快。

	UDP协议通信场景：
	语音通话，视频直播等。
	注：
	UDP把数据包扔出去就不管了，不管对方在不在线。像个导弹
	如果对方不在线了，可能收不到数据包，
	所以适合允许出错的传输，比如视频语音。
	视频语音丢一包数据最多会卡一下
	但支付宝转账等不允许出错
	
	
	构造器：创建DatagramSocket发送端和接收端对象（人）
	public DatagramSocket()				创建发送端的Socket对象，系统会随机分配一个端口号，也可以自己指定
​	public DatagramSocket(int port)		创建接收端的Socket对象并指定端口号

	DatagramSocket类成员方法
	public void send(DatagramPacket dp)		发送数据包
	public void receive(DatagramPacket p) 	接收数据包

	构造器：创建DatagramPacket数据包对象（韭菜盘子）
	1.public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
	创建发送端数据包对象
	buf：要发送的内容，字节数组	length：要发送内容的字节长度	
	address：接收端的IP地址对象	port：接收端的端口号
	
	2.public DatagramPacket(byte[] buf, int length)
	创建接收端的数据包对象
	buf：用来存储接收的内容
	length：能够接收内容的长度

	DatagramPacket常用方法   
	public int getLength()	获得实际接收到的字节个数

 */
public class Client_Test {
    public static void main(String[] args) throws Exception {//异常是怕你写的端口被注册过
        System.out.println("=====客户端启动======");

        // 1、创建发送端对象：发送端自带默认的端口号（人）
        DatagramSocket socket = new DatagramSocket(6666);//可以随机也可以指定

        // 2、创建一个数据包对象封装数据（韭菜盘子）
        /*
         public DatagramPacket(byte buf[], int length,
         InetAddress address, int port) 虽然只要填对方IP和端口，但发送端IP和端口也会打包在一起发送过去
		         参数一：封装要发送的数据（韭菜）
		         参数二：发送数据的大小
		         参数三：服务端的主机IP地址对象
		         参数四：服务端的端口
         */
        byte[] buffer = "哈哈哈哈哈".getBytes();
        DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
                InetAddress.getLocalHost(), 8888);
        		//要填地址对象，不能写localhost和127.0.0.1，发给别人用getByName(ip地址对象)
        // 3、发送数据出去（把韭菜抛出去）
        socket.send(packet);//客户端发送完数据包后程序就结束了，不管有没有成功，所以一定要先启动服务器
        
        // 4、释放资源
        socket.close();//资源对象会占用网卡资源，用完要关闭
    }
}
